home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
vol_300
/
359_11
/
patch5.000
/
GO32_NPX.ASM
< prev
next >
Wrap
Assembly Source File
|
1991-09-11
|
3KB
|
185 lines
; This is file NPX.ASM
;
; Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954
;
; This file is distributed under the terms listed in the document
; "copying.dj", available from DJ Delorie at the address above.
; A copy of "copying.dj" should accompany this file; if not, a copy
; should be available from where this file was obtained. This file
; may not be distributed without a verbatim copy of "copying.dj".
;
; This file is distributed WITHOUT ANY WARRANTY; without even the implied
; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
;
; History:69,29
title tables
.386p
include build.inc
include segdefs.inc
include tss.inc
include gdt.inc
include idt.inc
son macro
mov al,33h
out 61h,al
endm
soff macro
mov al,30h
out 61h,al
endm
;------------------------------------------------------------------------
start_data16
extrn _npx:byte
extrn ivec_number:byte
public _npx_stored
_npx_stored db 0 ; 0=in 387, 1=in _npx
temp87 dw 1 dup (?)
end_data16
;------------------------------------------------------------------------
start_code16
;------------------------------------------------------------------------
public _detect_80387 ; direct from the Intel manual
_detect_80387: ; returns 1 if 387, else 0
fninit
mov si,offset dgroup:temp87
mov word ptr [si],5a5ah
fnstsw [si]
cmp byte ptr [si],0
jne no_387
fnstcw [si]
mov ax,[si]
and ax,103fh
cmp ax,3fh
jne no_387
fld1
fldz
fdiv
fld st
fchs
fcompp
fstsw [si]
mov ax,[si]
sahf
je no_387
fninit ; 387 present, initialize.
fnstcw temp87
wait
and temp87,0fffah ; enable invalid operation exception
fldcw temp87
mov ax,1
ret
no_387:
mov ax,0
ret
;------------------------------------------------------------------------
public _ivec7
_ivec7:
push eax
mov eax,cr0
and eax,0FFFFFFF3h
mov cr0,eax
pop eax
iretd
public _fclex ; for either mode
_fclex:
in al,0a0h
test al,20h
jz fclex_ret
or ax,ax
out 0f0h,al
mov al,20h
out 0a0h,al
out 20h,al
fclex_ret:
ret
public _ivec75
_ivec75:
push ax
push ds
push g_core
pop ds
inc word ptr ds:[0b8004h]
push g_rdata
pop ds
mov _npx_stored,1
or ax,ax
out 0f0h,al
mov al,20h
out 0a0h,al
out 20h,al
; fnsave ds:[_npx]
db 66h,67h,0ddh,35h
dd offset _npx
fwait
mov ivec_number,75h
pop ds
pop ax
db 0eah
dw 0, g_itss
;------------------------------------------------------------------------
public __do_save_npx
__do_save_npx:
cmp _npx_stored,0
jne fpsave_ret
call _fclex
mov _npx_stored,1
; fnsave ds:[_npx]
db 66h,67h,0ddh,35h
dd offset _npx
fwait
fpsave_ret:
jmpt g_ctss
public __do_load_npx ; from *protected* mode
__do_load_npx:
cmp _npx_stored,0
je no_load_npx
call _fclex
mov _npx_stored,0
mov _npx[4],0 ; clear pending exceptions
; frstor [_npx]
db 66h,67h,0ddh,25h
dd offset _npx
no_load_npx:
ret
;------------------------------------------------------------------------
end_code16
;------------------------------------------------------------------------
start_code32
end_code32
;------------------------------------------------------------------------
end